package pe.gob.pnp.libreria;

import com.lowagie.text.Chunk;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Utiles {

      public static String numberToText(Integer numero ) {
                return convertNumberToLetter(numero.toString());
        }

        private static final String[] UNIDADES = { "", "UN ", "DOS ", "TRES ",
                "CUATRO ", "CINCO ", "SEIS ", "SIETE ", "OCHO ", "NUEVE ", "DIEZ ",
                "ONCE ", "DOCE ", "TRECE ", "CATORCE ", "QUINCE ", "DIECISEIS",
                "DIECISIETE", "DIECIOCHO", "DIECINUEVE", "VEINTE" };

        private static final String[] DECENAS = { "VENTI", "TREINTA ", "CUARENTA ",
                "CINCUENTA ", "SESENTA ", "SETENTA ", "OCHENTA ", "NOVENTA ",
                "CIEN " };

        private static final String[] CENTENAS = { "CIENTO ", "DOSCIENTOS ",
                        "TRESCIENTOS ", "CUATROCIENTOS ", "QUINIENTOS ", "SEISCIENTOS ",
                        "SETECIENTOS ", "OCHOCIENTOS ", "NOVECIENTOS " };

        /**
         * Convierte a letras un numero de la forma $123,456.32 (StoreMath)
         * <p>
         * Creation date 5/06/2006 - 10:20:52 AM
         * </p>
         * @param number Numero en representacion texto
         * @return Numero en letras
         * @since 1.0
         */
        public static String convertNumberToLetter(String number) {
                return convertNumberToLetter(Double.parseDouble(number));
        }

        /**
         * Convierte un numero en representacion numerica a uno en representacion de
         * texto. El numero es valido si esta entre 0 y 999'999.999
         * <p>
         * Creation date 3/05/2006 - 05:37:47 PM
         *
         * @param number
         *            Numero a convertir
         * @return Numero convertido a texto
         * @throws NumberFormatException
         *             Si el numero esta fuera del rango
         * @since 1.0
         */
        public static String convertNumberToLetter(double number) throws NumberFormatException {
                String converted = new String();

        // Validamos que sea un numero legal
        double doubleNumber = number;

        if (doubleNumber > 999999999)
                throw new NumberFormatException(
                                "El numero es mayor de 999'999.999, "
                                                + "no es posible convertirlo");

        String splitNumber[] = String.valueOf(doubleNumber).replace('.', '#')
                        .split("#");

        // Descompone el trio de millones - ¡SGT!
        int millon = Integer.parseInt(String.valueOf(getDigitAt(splitNumber[0],
                        8))
                        + String.valueOf(getDigitAt(splitNumber[0], 7))
                        + String.valueOf(getDigitAt(splitNumber[0], 6)));
        if (millon == 1)
                converted = "UN MILLON ";
        if (millon > 1)
                converted = convertNumber(String.valueOf(millon)) + "MILLONES ";

        // Descompone el trio de miles - ¡SGT!
        int miles = Integer.parseInt(String.valueOf(getDigitAt(splitNumber[0],
                        5))
                        + String.valueOf(getDigitAt(splitNumber[0], 4))
                        + String.valueOf(getDigitAt(splitNumber[0], 3)));
        if (miles == 1)
                converted += "MIL ";
        if (miles > 1)
                converted += convertNumber(String.valueOf(miles)) + "MIL ";

        // Descompone el ultimo trio de unidades - ¡SGT!
        int cientos = Integer.parseInt(String.valueOf(getDigitAt(
                        splitNumber[0], 2))
                        + String.valueOf(getDigitAt(splitNumber[0], 1))
                        + String.valueOf(getDigitAt(splitNumber[0], 0)));
        if (cientos == 1)
                converted += "UN";

        if (millon + miles + cientos == 0)
                converted += "CERO";
        if (cientos > 1)
                converted += convertNumber(String.valueOf(cientos));


        int centavos = Integer.parseInt(String.valueOf(getDigitAt(
                        splitNumber[1], 2))
                        + String.valueOf(getDigitAt(splitNumber[1], 1))
                        + String.valueOf(getDigitAt(splitNumber[1], 0)));
        if (centavos == 1)
                converted += " CON UN CENTAVO";
        if (centavos > 1)
                converted += " CON " + convertNumber(String.valueOf(centavos))
                                + " CENTAVOS";

        return converted;
}

/**
 * Convierte los trios de numeros que componen las unidades, las decenas y
 * las centenas del numero.
 * <p>
 * Creation date 3/05/2006 - 05:33:40 PM
 *
 * @param number
 *            Numero a convetir en digitos
 * @return Numero convertido en letras
 * @since 1.0
 */
private static String convertNumber(String number) {
        if (number.length() > 3)
                throw new NumberFormatException(
                                "La longitud maxima debe ser 3 digitos");

        String output = new String();
        if (getDigitAt(number, 2) != 0)
                output = CENTENAS[getDigitAt(number, 2) - 1];

        int k = Integer.parseInt(String.valueOf(getDigitAt(number, 1)) + String.valueOf(getDigitAt(number, 0)));

        if (k <= 20)
                output += UNIDADES[k];
        else {
                if (k > 30 && getDigitAt(number, 0) != 0)
                        output += DECENAS[getDigitAt(number, 1) - 2] + "Y " + UNIDADES[getDigitAt(number, 0)];
                else
                        output += DECENAS[getDigitAt(number, 1) - 2] + UNIDADES[getDigitAt(number, 0)];
        }

        // Caso especial con el 100
        if (getDigitAt(number, 2) == 1 && k == 0)
                output = "CIEN";

        return output;
}

    /**
     * Retorna el digito numerico en la posicion indicada de derecha a izquierda
     * <p>
     * Creation date 3/05/2006 - 05:26:03 PM
     *
     * @param origin
     *            Cadena en la cual se busca el digito
     * @param position
     *            Posicion de derecha a izquierda a retornar
     * @return Digito ubicado en la posicion indicada
     * @since 1.0
     */
    private static int getDigitAt(String origin, int position) {
            if (origin.length() > position && position >= 0)
                    return origin.charAt(origin.length() - position - 1) - 48;
            return 0;
    }

    public static String CalendarToString(Calendar fecha,String formato) throws Exception{
        if(nullToBlank(fecha).equals("")){
                return "";
        }
        SimpleDateFormat df = new SimpleDateFormat(formato);
        return df.format(fecha.getTime());
    }

    public static String DateToString(Date fecha,String formato){
        try {
             if(nullToBlank(fecha).equals("")){
                 return "";
            }
            SimpleDateFormat df = new SimpleDateFormat(formato);
            return df.format(fecha);
        } catch (Exception e) {
            System.out.println(""+e.getMessage());
        }
        return "";
    }

    public static Date stringToDate(String fecha,String formato){
        try {
            fecha = nullToBlank(fecha);
            GregorianCalendar gc = new GregorianCalendar();
            SimpleDateFormat df = new SimpleDateFormat(formato);
            gc.setTime(df.parse(fecha));
            return gc.getTime();
        } catch (Exception ex) {
            Logger.getLogger(Utiles.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public static int nullToZero(Object texto){
        try {
            return Integer.parseInt(texto.toString());
        } catch (Exception e) {
            return  0;
        }
    }
    
    public static String nullToBlank(Object texto){
        try {
                if(texto==null){
                    return "";
                }
                if(texto.toString().trim().equals("null")){
                    return "";
                }
                return texto.toString().trim();
                } catch (Exception e) {
                    return "";
                }

    }

    public static String formatonumero(Integer numero, String formato){
        NumberFormat formatter = new DecimalFormat(formato);
        return formatter.format(numero);
    }

    public static String formatoNumero(String numero, String caracter, int digitos){
        if(numero.length() < digitos)
            return formatoNumero(caracter + numero, caracter, digitos);
        return numero;
    }

    public static String formatoDecimal(Double suma) {
        DecimalFormat formateador = new DecimalFormat("####.##");
        return formateador.format (suma);
    }

     public static Paragraph textoSubrayado(String texto, Font fuente){
        Chunk chunk = new Chunk(texto,fuente);
        chunk.setUnderline(0.2f, -2f);
        Paragraph paragraph = new Paragraph("");
        paragraph.add(chunk);
        return paragraph;
    }

     public static Paragraph textoSubrayadoSuperior(String texto, Font fuente){
        Chunk chunk = new Chunk(texto,fuente);
        chunk.setUnderline(0.2f, 12f);
        Paragraph paragraph = new Paragraph("");
        paragraph.add(chunk);
        return paragraph;
    }
}
